﻿Imports System.IO
Public Class Form1
    Private Sub btLoadTiles_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadTiles.Click
        Dim fondo As New bennulib.fpg_file
        Dim archivo_tiles As New OpenFileDialog
        Dim archivo_mapa As New OpenFileDialog

        archivo_tiles.Filter = "Archivos FPG(*.fpg)|*.fpg"
        archivo_mapa.Filter = "Archivos Mapa TileStudio(*.bin)|*.bin"

        If archivo_tiles.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If fondo.load_fpg(archivo_tiles.FileName) Then
                If archivo_mapa.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    dibujar_mapa(fondo, archivo_mapa.FileName, Panel1)
                End If
            Else
                MsgBox("fallo al cargar el fpg")
            End If
        End If

        archivo_tiles.Dispose()
        archivo_mapa.Dispose()
    End Sub

    Private Sub rellenar_cuadricula(ByVal fpg As bennulib.fpg_file, ByVal panel As Panel)
        Const grid_size = 32 'tamaño casillas
        Const grid_row = 16 'casillas por fila

        Dim casilla(fpg.num_imagenes) As PictureBox

        For i = 0 To fpg.num_imagenes
            'creamos la cuadricula
            casilla(i) = New PictureBox
            casilla(i).Image = fpg.get_image(i)
            casilla(i).Size = New Size(grid_size, grid_size)
            casilla(i).Location = New Point(grid_size * (i Mod grid_row), grid_size * Fix((i / grid_row)))

            casilla(i).SizeMode = PictureBoxSizeMode.StretchImage
            'cuadros(imagenes).BorderStyle = BorderStyle.FixedSingle
            'cuadros(imagenes).BackColor = Color.Transparent

            panel.Controls.Add(casilla(i))
        Next
    End Sub

    Public Sub dibujar_mapa(ByVal fpg As bennulib.fpg_file, ByVal map_file As String, ByVal panel As Panel)
        Const c_tile_size = 16

        Dim archivo As New FileStream(map_file, FileMode.Open)
        Dim data As New BinaryReader(archivo)
        Dim num_tiles, tiles_x, tiles_y As Integer
        Dim tile_size = New Size(c_tile_size, c_tile_size)

        num_tiles = data.ReadByte
        tiles_x = data.ReadByte
        tiles_y = data.ReadByte

        'creamos el mapa en memoria
        Dim mapa_imagen As New Bitmap(tiles_x * c_tile_size, tiles_y * c_tile_size)
        Dim g As Graphics = Graphics.FromImage(mapa_imagen)

        'componemos la imagen de fondo que ira en el picturebox
        For y = 0 To tiles_y - 1
            For x = 0 To tiles_x - 1
                g.DrawImage(fpg.get_image(data.ReadByte - 1), New Point(c_tile_size * x, c_tile_size * y))
            Next
        Next

        'establecemos la imagen en el picture de fondo
        Fondo_PictureBox.Image = mapa_imagen
        Fondo_PictureBox.Size = New Size(tiles_x * c_tile_size, tiles_y * c_tile_size)


        'cerramos los recursos usados
        g.Dispose()
        data.Dispose()
        archivo.Dispose()

    End Sub

    Private Sub btInsertarPersonaje_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btInsertarPersonaje.Click
        Dim archivo_personaje As New OpenFileDialog
        Dim personaje As Bitmap

        If Not insertar_personaje Then
            archivo_personaje.Filter = "Archivos FPG(*.fpg)|*.fpg"

            If archivo_personaje.ShowDialog() = Windows.Forms.DialogResult.OK Then
                fich_personaje.load_fpg(archivo_personaje.FileName)
                personaje = fich_personaje.get_image(1)
                personaje.MakeTransparent(Color.FromArgb(fich_personaje.get_pal_r(0), fich_personaje.get_pal_g(0), fich_personaje.get_pal_b(0)))
                insertar_personaje = True
                Me.Cursor = New Cursor(fich_personaje.get_image(1).GetHicon)
            End If
        End If

    End Sub

    
    Private Sub Panel1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        
        If e.Delta <> 0 Then
            If e.Delta <= 0 Then
                If Fondo_PictureBox.Width < 500 Then Exit Sub 'minimum 500?
            Else
                If Fondo_PictureBox.Width > 4000 Then Exit Sub 'maximum 2000?
            End If

            Fondo_PictureBox.Width += CInt(Fondo_PictureBox.Width * e.Delta / 1000)
            Fondo_PictureBox.Height += CInt(Fondo_PictureBox.Height * e.Delta / 1000)
        End If
    End Sub

    Private Sub Fondo_PictureBox_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Fondo_PictureBox.MouseClick
        Dim imagen_objeto As Bitmap


        If insertar_personaje Then
            objetos(num_objetos) = New objeto
            objetos(num_objetos).tipo = 0
            objetos(num_objetos).xx = Fondo_PictureBox.PointToClient(Control.MousePosition).X
            objetos(num_objetos).yy = Fondo_PictureBox.PointToClient(Control.MousePosition).Y


            objetos_pbox(num_objetos) = New PictureBox
            imagen_objeto = fich_personaje.get_image(1)
            imagen_objeto.MakeTransparent(Color.FromArgb(fich_personaje.get_pal_r(0), fich_personaje.get_pal_g(0), fich_personaje.get_pal_b(0)))

            objetos_pbox(num_objetos).Image = imagen_objeto
            objetos_pbox(num_objetos).BackColor = Color.Transparent
            objetos_pbox(num_objetos).SizeMode = PictureBoxSizeMode.Zoom

            objetos_pbox(num_objetos).Width = fich_personaje.get_image_width(1)
            objetos_pbox(num_objetos).Height = fich_personaje.get_image_height(1)
            objetos_pbox(num_objetos).Location = New Point(objetos(num_objetos).xx - (objetos_pbox(num_objetos).Width / 2), objetos(num_objetos).yy - (objetos_pbox(num_objetos).Height / 2))

            'Panel1.Controls.Add(objetos_pbox(num_objetos))
            Fondo_PictureBox.Controls.Add(objetos_pbox(num_objetos))
            'Panel1.Controls.SetChildIndex(objetos_pbox(num_objetos), 0)
            'objetos_pbox(num_objetos).Parent = Fondo_PictureBox


            num_objetos += 1
            insertar_personaje = False
            Me.Cursor = Cursors.Arrow

        End If
    End Sub

    Private Sub Fondo_PictureBox_MouseEnter1(ByVal sender As Object, ByVal e As System.EventArgs) Handles Fondo_PictureBox.MouseEnter
        Panel1.Focus()
    End Sub


   
    Private Sub Fondo_PictureBox_MouseMove1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Fondo_PictureBox.MouseMove
        ToolStripStatusLabel1.Text = "X: " & e.X & " Y: " & e.Y
    End Sub

    
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim inc = 16
        Dim div = 100
        objetos_pbox(0).Width += CInt(objetos_pbox(0).Width * inc / div)
        objetos_pbox(0).Height += CInt(objetos_pbox(0).Height * inc / div)
        Fondo_PictureBox.Width += CInt(Fondo_PictureBox.Width * inc / div)
        Fondo_PictureBox.Height += CInt(Fondo_PictureBox.Height * inc / div)
        objetos_pbox(0).Location = New Point(objetos_pbox(0).Location.X + 16, objetos_pbox(0).Location.Y + 16)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim inc = -16
        Dim div = 100
        objetos_pbox(0).Width += CInt(objetos_pbox(0).Width * inc / div)
        objetos_pbox(0).Height += CInt(objetos_pbox(0).Height * inc / div)
        Fondo_PictureBox.Width += CInt(Fondo_PictureBox.Width * inc / div)
        Fondo_PictureBox.Height += CInt(Fondo_PictureBox.Height * inc / div)
        objetos_pbox(0).Location = New Point(objetos_pbox(0).Location.X - 8, objetos_pbox(0).Location.Y - 8)
    End Sub
End Class